import dayjs from 'dayjs';

/**
 * getDatesInRange - 将日期区间转换为区间内的每个日期数组
 * @param {Date} startDate - 起始时间 例如：2024-07-25
 * @param {Date} endDate - 结束时间 例如：2024-07-27
 * @return {Date[]} - 数组中包含区间内的每个日期 例如：['2024-07-25','2024-07-26','2024-07-27']
 */
export function getDatesInRange(startDate: Date, endDate: Date) {
	let currentDate = new Date(startDate);
	let endDateTemp = new Date(endDate);
	let dates = [];

	// 循环直到 currentDate 大于 endDate
	while (currentDate <= endDateTemp) {
		dates.push(dayjs(currentDate).format('YYYY-MM-DD')); // 将日期添加到数组中
		currentDate.setDate(currentDate.getDate() + 1); // 递增一天
	}
	return dates;
}

/**
 * groupConsecutiveDates - 把不规则的日期数组整合为连续的日期区间二维数组
 * @param {Date[]} dates - 为不连续的日期数组 例如：['2024-07-25','2024-07-26','2024-07-27','2024-08-03']
 * @return {Date[][]} - 返回为日期连续的二维数组结构 例如：[['2024-07-25','2024-07-27'],['2024-08-03']]
 */
export function groupConsecutiveDates(dates: Date[]) {
	if (dates.length === 0) {
		return [];
	}

	// 将字符串日期转换为 Date 对象，并按照日期先后排序
	const dateObjects = dates.map((dateStr) => new Date(dateStr)).sort((a: any, b: any) => a - b);

	// 初始化结果数组
	const result = [];
	let tempGroup = [dateObjects[0]];

	// 遍历日期对象数组，检查连续的日期
	for (let i = 1; i < dateObjects.length; i++) {
		const currentDate: any = dateObjects[i];
		const previousDate: any = dateObjects[i - 1];

		// 判断是否为连续日期
		const diffInDays = (currentDate - previousDate) / (1000 * 60 * 60 * 24);
		if (diffInDays === 1) {
			// 如果是连续日期，添加到当前分组
			tempGroup.push(currentDate);
		} else {
			// 如果不是连续日期，将当前分组加入结果，并重新开始一个新的分组
			result.push(tempGroup.map((date) => date.toISOString().slice(0, 10)));
			tempGroup = [currentDate];
		}
	}

	// 将最后一个分组加入结果数组
	if (tempGroup.length > 0) {
		result.push(tempGroup.map((date) => date.toISOString().slice(0, 10)));
	}

	return result;
}
